|
オーバービュiTunesのビジュアルエフェクトボタンをクリックすると、音楽のリズムに合わせて変化するグラフィックを鑑賞できます。
図1 ビジュアルエフェクトボタン Mac OS 9やMac OS Xなどの異なるプラットフォームをサポートできるように、iTunesのプラグインは1つのエントリ関数を持った共有ライブラリとして実装されています。また、iTunesのプラグインはiTunesアプリケーション自体にリンクされません。プラグインが初期化される際にコールバック用の関数ポインタが提供されますので、iTunes APIへのアクセスはすべてこのコールバック関数経由で行います。 iTunesは様々な場面でビジュアルプラグインにメッセージを送信します。これらのメッセージはプラグインの初期化時と終了時、ユーザがビジュアルエフェクトを“入”または“切”にした時、ウインドウのサイズが変わった時、ユーザが音楽を再生または停止した時に送信されます。更にビジュアルエフェクト表示中はマウスイベント、キーボードイベント、ビジュアルエフェクトウインドウのアップデートイベントがビジュアルプラグインに送信されます。メッセージは後程詳しく解説します。 iTunesは再生されている音楽に合わせて、サウンドのサンプルデータと周波数データをビジュアルプラグインに送信します。プラグイン登録時には、プラグインが受け取るチャンネル数とデータの受信頻度を指定することができます。 プラグイン登録時にはアイドルメッセッジを受け取るかどうか指定することができます。アイドルメッセージは音楽が再生されているかどうかに関わらず、定期的に送信されます。例えば、音楽が停止した時にビジュアルエフェクトをゆっくりフェードアウトさせるようなことは、アイドルイベントを受け取ることで実現できます。 プラグインの環境設定はiTunesの環境設定ファイルに混在させることが可能です。iTunesはプラグインの環境設定にアクセスするためのAPIを提供しています。また、ユーザが“オプション”ボタンをクリックすると、iTunesはConfigureメッセージをアプリケーションに送信しますので、この時に環境設定ダイアログを表示するなどします。 iTunesのメッセージはすべてシステムタスクレベル(アプリケーションコードが実行するレベル)で送信されます。iTunes APIの各関数もシステムタスクレベルで呼び出さなければなりません。他のレベル(プリエンプティブタスクや遅延タスクなど)から呼び出すことはできません。実行レベルについてはテクニカルノート1104をご覧下さい。 プラグインの発見と登録プロセスiTunesがプラグインをロードする時は、プラグインフォルダをリカーシブに検索します。Mac OS 9の場合、プラグインフォルダはiTunesアプリケーションと同じディレクトリにあります。Mac OS Xの場合、iTunesは‾/Library/iTunes/iTunes Plug-ins/と/Library/iTunes/iTunes Plug-ins/(ディレクトリが存在する場合のみ)を検索します。Mac OS 9の場合、iTunesはファイルタイプが‘hvpl’である共有ライブラリをビジュアルプラグインとして認識します。Mac OS Xの場合、iTunesはCFBundlePackageTypeが‘hvpl’と定義されているバンドル化されたプラグインをビジュアルプラグインとして認識します。このため、Mac OS 9とMac OS Xで動作するビジュアルプラグインは別々のバイナリが必要になります。プラグインは標準のアイコンを使用して下さい(プラグインのクリエータコードをiTunesのクリエータコードに合わせます。) iTunes Visual Plug-in SDKに含まれているビジュアルプラグインのサンプルコードはMac OS 9とMac OS Xの2つの形式で提供されています。 プラグインライブラリは1つのエントリ関数をexportします。実際にexportされる関数名はプラグインのパッケージ形式によって異なります。プラグインが単一ファイルでCFMの共有ライブラリとして構成されている場合、エントリ関数はCFMのメインエントリ関数であれば、関数名は何でも構いません。一方、プラグインがバンドル化されたCFM形式である場合、エントリ関数は“iTunesPluginMain”でなければなりません。プラグインがバンドル化されたMach-O形式である場合、エントリ関数は“iTunesPluginMainMachO”でなければなりません。このエントリ関数を今後メインエントリポイントと呼びます。 iTunesがプラグインを発見すると、iTunesはそのプラグインのメインエントリポイントに対してkPluginInitMessageメッセージを送信します。単一ファイルのプラグインに複数のプラグインが入っている場合や、バンドル構成のプラグインに複数のプラグインが入っている場合、iTunesはkPluginInitMessageメッセージを一度しか送信しませんので、メッセージを受け取ったメインエントリポイントは自分の下にぶら下がっているプラグインにメッセージを伝える必要があります。 ビジュアルプラグインをiTunesに登録するためにはPlayerRegisterVisualPlugInを呼びます。PlayerRegisterVisualPlugInに渡すパラメータの1つは自分のビジュアルプラグインのメッセージハンドラ関数へのポインタです。kVisualPlugIn...で始まるメッセージはすべてこのメッセージハンドラ関数に送信されます。例えば、登録直後には、kVisualPluginInitMessageメッセージがメッセージハンドラ関数に送信されます。 プラグインを終了させる手続きは特に必要ありません。終了時はプラグインのメッセージハンドラ関数にkVisualPluginCleanupMessageメッセージが送信された後、プラグインのメインエントリポイントにkPluginCleanupMessageメッセージが送信されます。 iTunesの将来のバージョンと互換性を保つために、現在定義されていないメッセージを受け取った場合は、必ずunimpErrを返すようにして下さい。 メッセージ1. プラグインのメインエントリポイントに送信されるメッセージ以下のメッセージはビジュアルプラグインのメインエントリポイントに送信されます。ビジュアルプラグインのメインエントリポイントは次のように定義されています。
message メッセージの種類 messageInfo メッセージパラメータへのポインタ(パラメータが無い場合もあります) refCon PluginInitMessage.refCon時に返した値です このテーブルではプラグインのメインエントリポイントに送信されるメッセージの一覧と該当するPluginMessageInfoの種類を記述しています。パラメータを持たないメッセージは“n/a”となっています。このようなメッセージの場合はmessageInfoを無視します。
kPluginInitMessageこのメッセージは起動時にプラグインの共有ライブラリに送信されます。プラグインはここでPlayerRegisterVisualPlugInを呼び出して、iTunesに登録します。次に、PluginInitMessageのoptionsとrefconフィールドを記入して返します。 messageInfo->uは次のようにPluginInitMessageとなります
majorVersion minorVersion 現在実行しているiTunesアプリケーションが実装しているiTunes APIのバージョン番号 appCookie appProc コールバックAPIに渡すパラメータ options ビジュアルプラグインはこのフィールドをゼロにします。optionsフィールドは現在デバイスプラグイン用に使用されています。 refCon refconフィールドで返す値は、後程のメッセージ送信時のrefconパラメータに入ります kPluginCleanupMessage このメッセージはiTunes終了直前にプラグインに送信されます。 kPluginIdleMessage ビジュアルプラグインでは使用しません。このメッセージはデバイスプラグイン用に設けてあります。アイドル処理を行うビジュアルプラグインは専用のkVisualPluginIdleMessageを使用して下さい。 2. Visual plug-in messagesビジュアルプラグインのメッセージハンドラ関数は次のように定義されています。
message メッセージの種類 messageInfo メッセージパラメータへのポインタ(パラメータが無い場合もあります) refCon VisualPluginInitMessage.refConで指定した値が入ります このテーブルではビジュアルプラグインのメッセージハンドラ関数に送信されるメッセージの一覧と該当するVisualPluginMessageInfoの種類を記述しています。パラメータを持たないメッセージは“n/a”となっています。このようなメッセージの場合はmessageInfoを無視します。
kVisualPluginInitMessageこのメッセージはPlayerRegisterVisualPluginでビジュアルプラグインを登録した直後に送信されます。このメッセージについてのみ、refConパラメータはPlayerRegisterVisualPluginMessage.registerRefConで指定した値が入ります。プラグインはVisualPluginInitMessageのoptionsとrefConフィールドを記入して返します。 messageInfo->u.visualPluginInitMessageは次のようにVisualPluginInitMessageとなります
messageMajorVersion 現在実行しているiTunesアプリケーションが実装しているiTunes APIのバージョン番号 appVersion 現在実行しているiTunesアプリケーションのバージョン番号 appCookie この2つのフィールドは後程iTunes APIを利用する際に必要になりますので、プラグイン内部で保持する必要があります。 options 現在定義されているオプションはありません。このフィールドはゼロに設定します。 refCon このフィールドの値は、ビジュアルプラグインのメッセージハンドラに渡されます。プラグインはこの値を自由に使用できます。サンプルコードはこの値を使って、内部データへのポインタを保持しています。 kVisualPluginCleanupMessageこのメッセージはiTunes終了直前に送信されます。ビジュアルプラグインで使用しているリソース(メモリ、ファイルなど)はこの時に解除します。 kVisualPluginIdleMessageこのメッセージはアイドルメッセージを要求した場合のみ定期的に送信されます。アイドルメッセージを要求するには、PlayerRegisterVisualPluginMessage.optionsフィールドのkVisualWantsIdleMessagesを設定します。 kVisualPluginConfigureMessageこのメッセージはユーザがiTunesウインドウ右上の“オプション”ボタンをクリックした時に送信されます。オプションボタンはPlayerRegisterVisualPluginMessage.optionsフィールドでkVisualWantsConfigureを設定することによって使用可能となります。設定ダイアログの表示方法、リソースフォークの使い方、PlayerHandleMacOSEventの使い方などについてはサンプルコードをご覧下さい。 kVisualPluginEnableMessagekVisualPluginDisableMessageiTunesはすべてのビジュアルプラグインを使用可能にしますので、このメッセージに対してはnoErrを返します。 kVisualPluginShowWindowMessageこのメッセージはビジュアルエフェクトが実際に稼動した時に送信されます。ビジュアルエフェクトに必要なメモリ領域などはこの時に確保します。 messageInfo->u.showWindowMessageは次のようにVisualPluginShowWindowMessageとなります
port ビジュアルエフェクトを描画するためのポート。このパラメータは後程のrenderメッセージやupdateメッセージに含まれませんので、ビジュアルプラグイン側で値を保持しなければなりません。 drawRect ビジュアルエフェクトを描画する範囲。このパラメータは後程のrenderメッセージやupdateメッセージに含まれませんので、ビジュアルプラグイン側で値を保持しなければなりません。 options 現在定義されているオプションはkWindowIsFullScreenのみです。kWindowIsFullScreenはiTunesがフルスクリーンモードで実行していることを示します。 kVisualPluginHideWindowMessageこのメッセージはビジュアルエフェクトが停止された時に送信されます。ビジュアルエフェクトで使用したメモリ領域などはこの時に解除します。 kVisualPluginSetWindowMessageこのメッセージはユーザがiTunesウインドウの大きさを変更した場合や、フルスクリーンモードを入/切した場合に送信されます。考え方としては、kVisualPluginHideWindowMessageに引き続き、kVisualPluginShowWindowMessageが送信された状態と同じですが、ビジュアルプラグインによっては、単一の切り替えメッセージが扱いやすいでしょう。 kVisualPluginRenderMessageこのメッセージは音楽再生中、登録時に指定した間隔で定期的に送信されます。 messageInfo->renderMessageは次のようにVisualPluginShowWindowMessageとなります
renderData->numWaveformChannels サウンドサンプルデータのチャンネル数。ビジュアルプラグイン登録時に指定した値です。 renderData->waveformData 現在再生されているサウンドサンプルデータの上位8ビット。このパラメータの範囲は0から255まで、128が中心点(ACがゼロ)となります。 renderData->numSpectrumChannels 周波数データのチャンネル数。ビジュアルプラグイン登録時に指定した値です。 renderData->spectrumData 現在再生されているサウンドサンプルデータに512ポイントのFFTをかけた周波数データ。 kVisualPluginUpdateMessageこのメッセージはアップデートイベントがあった時に送信されます。ビジュアルプラグインは自分のポートを更新(描画)します。このメッセージはプラグインのウインドウが表示されている場合のみ(kVisualPluginShowWindowMessageメッセージが呼ばれてからkVisualPluginHideWindowMessageメッセージが呼ばれるまでの間)に送信されます。 kVisualPluginPlayMessageこのメッセージはiTunesが音楽トラックを再生した時に送信されます。ビジュアルエフェクトで音楽トラックの情報を表示する場合、ビジュアルプラグインはここで音楽トラックの情報を取得します。 messageInfo->u.playMessageは次のようにVisualPluginPlayMessageとなります
kVisualPluginChangeTrackMessageこのメッセージは音楽トラックの情報が変更された時に送信されます。例えば、ユーザが音楽トラックの情報を編集した場合や、異なるトラックを再生し始めた場合に送信されます。ビジュアルプラグインはここで音楽トラックの情報を更新します。 messageInfo->u.changeTrackMessageは次のようにVisualPluginChangeTrackMessageとなります
kVisualPluginStopMessageこのメッセージは音楽の再生が停止された時に送信されます。 kVisualPluginSetPositionMessageこのメッセージは音楽トラックの経過時間が変わった時に送信されます。音楽トラックの経過時間を表示するようなビジュアルプラグインはこの値を使用します。 messageInfo->u.setPositionMessageは次のようにVisualPluginSetPositionMessageとなります
kVisualPluginPauseMessagekVisualPluginUnpauseMessageiTunesは現在一時停止機能を停止と再生の組み合わせで実装しています。ビジュアルプラグインはこのメッセージに対してnoErrを返します。 kVisualPluginEventMessageこのメッセージはプラグインで処理可能なユーザイベントが発生した時に送信されます。ビジュアルプラグインでイベントを処理した場合はnoErrを返します。処理しなかった場合はunimpErrを返します。 messageInfo->u.eventMessageは次のようにVisualPluginEventMessageとなります
コールバックAPI最初に述べた通り、プラグインはiTunesアプリケーションに直接リンクしません。そのかわり、iTunes APIはcookieパラメータとコールバック関数のポインタから成り立っているので、パラメータ管理やiTunes APIの呼び出しはすべてiTunesAPI.cのグルーコードに任せます。プラグインが必要とするcookieパラメータとコールバック関数は初期化時のメッセージで受け取ります。
ビジュアルプラグインはkPluginInitMessageを受信した時にPlayerRegisterVisualPlugInを呼び出します。messageInfoパラメータはPlayerRegisterVisualPluginMessageで定義されている構造体を渡します。PlayerRegisterVisualPluginMessageの各フィルドの定義は次の通りです。
長時間かかるような処理を行う場合はPlayerIdleを呼び出して、iTunesに処理時間を与えます。
“iTunesについて...”ウインドウを表示します。
iTunesアプリケーションに特定のURLを開くよう指示します。urlStringパラメータはPascal形式でも、C形式の文字列でもありません。urlStringの長さはlengthパラメータで指定します。
ビジュアルプラグインの環境設定データをまとめてiTunesの環境設定ファイルから読み込みます。PlayerRegisterVisualPluginMessage.nameで指定した名称が環境設定データのキーとして使用されます。
ビジュアルプラグインの環境設定データをまとめてiTunesの環境設定ファイルに書き込みます。PlayerRegisterVisualPluginMessage.nameで指定した名称が環境設定データのキーとして使用されます。
ビジュアルプラグインの環境設定データを部分的にiTunesの環境設定ファイルから読み込みます。PlayerRegisterVisualPluginMessage.nameで指定した名称とdataNameパラメータが環境設定データのキーとして使用されます。
ビジュアルプラグインの環境設定データを部分的にiTunesの環境設定ファイルに書き込みます。PlayerRegisterVisualPluginMessage.nameで指定した名称とdataNameパラメータが環境設定データのキーとして使用されます。
iTunesにMac OSイベントの処理を依頼します。サンプルコードでは、SettingsDialogFilterProcでPlayerHandleMacOSEventを使用しています。
ビジュアルプラグインのFSSpecを取得します。バンドル化されているビジュアルプラグインの場合、FSSpecはバンドルを指します。
iTunesのフルスクリーンモードを開始/終了します。スクリーンセーバのような働きをするプラグインはこの関数を使用します。
フルスクリーンモード使用時の解像度と色数を指定します。独自のオプション設定ダイアログなどでユーザ操作によって解像度と色数が変更された場合は、登録時にPlayerRegisterVisualPlugInMessageで指定した値をここで変更できます。 参考文献 |